-- group_damage
-- create by wangy
-- 释放群攻技能

-- 施放群攻技能
local skillDamage = function(aliveMonsters, args)

    local pos = aliveMonsters[1];
    local baseId = args["base_id"];

    -- 需要瞄准的技能优先选择优先攻击的怪物，没有只好委屈第一个了
    for i = 1, #aliveMonsters do
        local grid = DungeonM.getGridByPos(aliveMonsters[i]);
        local classId = grid.monster:query("base_class_id");
        if baseId and classId and table.indexOf(baseId, classId) >= 0 then
            -- 找到优先攻击的怪物
            pos = aliveMonsters[i];
            break;
        end
    end

    local grid = DungeonM.getGridByPos(pos);

    -- 如果怪物已经死亡了
    if not grid.monster or grid.monster:isDead() then
        return false;
    end

    -- 使用群攻击魔法
    local tactics = AutoFightM.getTacticsCfg()["group_damage"];

    -- 整理自己有的可以用的卷轴
    -- 虽然有不需要瞄准的，还是判断下该怪物是否免疫即将施放的技能
    local spells = {};
    for _, classId in pairs(tactics["args"]) do
        local skillId = SpellM.query(classId, "cast_skill_id");
        -- 提前判断魔法值不足的情况，否则会一直提示
        if SpellM.calcSpellCost(classId) > ME.user:getMp() then
            return false;
        end

        if ItemM.getAmount(ME.user, classId) > 0 and
            SpellM.canUseSpell(classId, grid:getPos()) and
            not SkillM.immunitySkill(ME.user, grid.monster, skillId) then
            table.insert(spells, classId);
        end
    end

    if #spells <= 0 then
        -- 没有群攻击卷轴
        return false;
    end

    -- 随机使用一个
    local index = math.random(#spells);
    local classId = spells[index];
    return DungeonActionM.go("use_spell", grid:getPos(), classId);
end

-- 使用全体伤害道具
local property = function(aliveMonsters, args)
    -- 可以施放群攻的道具，优先使用道具
    local property = args["property"] or {};
    for _, classId in pairs(property) do
        if ItemM.getAmount(ME.user, classId) > 0 then
            return DungeonActionM.go("use_property", 0, classId);
        end
    end
    return false;
end

return {
    -- 判断
    canTrigger = function(args)
        -- 无视层数，这层的怪物有那么多,估计就是神龙夹层财富
        local aliveMonsters = AutoFightM.getData()["aliveMonsters"];
        if aliveMonsters and #aliveMonsters >= 12 then
            return true;
        end

        local start = args["start"];
        local layer = DungeonM.currentLayer();
        if start and layer < start then
            -- 没到指定的层数
            return false;
        end

        return true;
    end,

    -- 触发
    trigger = function(args)
        -- 群攻嘛，当然要怪物足够多的情况下使用，三个应该是很多的
        local aliveMonsters = AutoFightM.getData()["aliveMonsters"];
        if not aliveMonsters or #aliveMonsters < 3 then
            return false;
        end

        -- 使用道具，击杀怪物
        local ret = property(aliveMonsters, args);
        if ret then
            -- 抛出事件
            EventMgr.fire(event.PLAYER_MOVE, ret);
            return true;
        end

        -- 施放技能，击杀怪物
        ret = skillDamage(aliveMonsters, args);
        if ret then
            -- 抛出事件
            EventMgr.fire(event.PLAYER_MOVE, ret);
            return true;
        end

        return false;
    end,
};
